package stack

import (
	"fmt"
	"log"
)

/**
	要实现的功能
	1 获取栈长度
	2 入栈
	3 出栈
	4 清空栈内容
	5 判断栈是否为空
	6 判断栈是否已满
	7 展示所有的内容
**/

/*
Stack 栈的定义
*/
type Stack struct {
	size int64 //容量
	top  int64 //栈顶
	data []interface{}
}

/*
MakeStack  初始化栈
*/
func MakeStack(size int64) Stack {
	s := Stack{}
	s.size = size
	s.data = make([]interface{}, size)
	s.top = 0
	return s
}

/*
Push 	入栈, 栈顶升高
*/
func (t *Stack) Push(data interface{}) bool {
	if t.isFull() {
		fmt.Println("栈已满, 无法加入新元素")
		return false
	}
	t.data[t.top] = data
	t.top++
	return true
}

/*
Pop 弹出数据
*/
func (t *Stack) Pop() (r interface{}, err error) {
	if t.isEmpty() {
		err = fmt.Errorf("栈已空，无法继续弹出")
		log.Println("栈已空，无法继续弹出")
		return
	}
	t.top--
	r = t.data[t.top]
	return
}

func (t *Stack) isEmpty() bool {
	return t.top == 0
}

/*
isFull 判断栈是否已满
*/
func (t *Stack) isFull() bool {
	return t.top == t.size
}

//Clear  清空栈
func (t *Stack) Clear() {
	t.top = 0
}

// Show 展示所有内容
func (t *Stack) Show() {
	var i int64 = 0
	for ; i < t.top; i++ {
		fmt.Println(t.data[i])
	}
}
